|
(******************************************************************************)
(**) ОТДЕЛ ПроГаусс+;
(******************************************************************************
* НАЗНАЧЕНИЕ:
* решение систем линейных уравнений (A*x=b) методом исключений Гаусса
*
* ПРИМЕЧАНИЯ:
* В данном приложении метод применяется для решения последовательности
* систем Гильберта увеличивающегося порядка. Системы Гильберта имеют
* плохо обусловленные матрицы (определитель близок к 0), поэтому, при
* существующей точности вычислений, начиная с некоторого порядка системы
* такие матрицы будут рассматриваться алгоритмом, как вырожденные. Это
* произойдет после того, как определитель системы станет меньше Матем.МАШЕПС.
******************************************************************************)
ИСПОЛЬЗУЕТ
Вект ИЗ "...\Отделы\Числа\",
Матр ИЗ "...\Отделы\Числа\",
МатрВВ ИЗ "...\Отделы\Числа\",
Вывод ИЗ "...\Отделы\Обмен\";
(******************************************************************************)
ЗАДАЧА Гильберт(A+:Матр.Вид; b+:Вект.Вид);
(* Построение системы Гильберта n-го порядка
A[0..n-1,0..n-1] = матрица системы:
( 1 1/2 1/3 1/4 ... 1/n )
( 1/2 1/3 1/4 1/5 ... 1/(n+1) )
A = ( 1/3 1/4 1/5 1/6 ... 1/(n+2) )
( ........................................... )
( 1/n 1/(n+1) 1/(n+2) 1/(n+3) ... 1/(2N-1) )
b[0..n-1] = вектор свободных членов:
n
b[i] = Sum A[i,j]
j=1
Тогда вектор решения будет x = [1 1 1 ... 1] *)
ПЕР
i,j,посл:ЦЕЛ;
УКАЗ
посл:=РАЗМЕР(A)-1;
(* первая строка *)
A[0,0]:=1;
ОТ j:=1 ДО посл ВЫП
A[0,j]:=1/(j+1)
КОН;
(* оставшиеся строки *)
ОТ i:=1 ДО посл ВЫП
(* последний столбец *)
A[i,посл]:=1/(посл+i+1);
(* заполнить матрицу *)
ОТ j:=0 ДО посл-1 ВЫП
A[i,j]:=A[i-1,j+1]
КОН
КОН;
(* вектор постоянных членов *)
ОТ i:=0 ДО посл ВЫП
b[i]:=0;
ОТ j:=0 ДО посл ВЫП
b[i]:=b[i]+A[i,j]
КОН
КОН
КОН Гильберт;
(******************************************************************************)
ЗАДАЧА Голова;
ПЕР
n:ЦЕЛ; (* порядок системы *)
A :Матр.Доступ; (* матрица системы *)
Ao:Матр.Доступ; (* обратная матрица *)
b :Вект.Доступ; (* вектор свободных членов *)
x :Вект.Доступ; (* вектор решения *)
УКАЗ
n:=2;
КОЛЬЦО
Вывод.ЧЦел("^Порядок системы: %d^",n,0,0,0);
СОЗДАТЬ(A,n,n);
СОЗДАТЬ(Ao,n,n);
СОЗДАТЬ(b,n);
СОЗДАТЬ(x,n);
Гильберт(A^,b^);
ЕСЛИ n < 7 ТО
Вывод.Цепь("^Матрица системы:^");
МатрВВ.ВыводМатр("%8.4f",A^);
Вывод.Цепь("^Свободные члены:^");
МатрВВ.ВыводВект("%8.4f",b^)
КОН;
ЕСЛИ Матр.МетодГаусса(A^,b^,Ao^,x^) = 0 ТО
Вывод.Цепь("^Вектор решения:^");
МатрВВ.ВыводВект("%8.4f",x^);
ИНАЧЕ
Вывод.Цепь("^Вырожденная матрица!^");
ВЫХОД
КОН;
УВЕЛИЧИТь(n)
КОН
КОН Голова;
(******************************************************************************)
УКАЗ
Голова
КОН ПроГаусс.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|